/**
 * @file
 * @brief Client的共享内存模块
 * @note 用于将图片共享到其他程序中
 */

#ifndef SHARE_MEM_H
#define SHARE_MEM_H

#include <string>
#include <semaphore.h>
#include "ImageType.hpp"

/**
 * @class ShareMem
 * @brief 封装POSIX的共享内存和信号量
 * @note
 * 共享内存结构   
 * | 帧号 int64 | 图片数据 |
 * 但不指定图片数据格式
 */
class ShareMem
{
  private:
    /**
     * @brief 共享内存文件描述符
     */
    int memfd;
    /**
     * @brief 共享内存地址
     */
    unsigned char* memaddr;
    /**
     * @brief 共享内存名称
     */
    std::string memname;
    /**
     * @brief 共享内存大小
     */
    long len;
    /**
     * @brief POSIX信号量对象
     */
    sem_t* sem;
    /**
     * @brief 信号量名称
     */
    std::string semname;
  public:
    /**
     * @brief 构造函数
     * @exception std::runtime_error 打开共享内存或信号量失败
     *
     * @param name 设备UUID
     * @param size 共享内存大小
     */
    ShareMem(const std::string & name,long size);
    /**
     * @brief 析构函数
     */
    virtual ~ShareMem();
    /**
     * @brief 写入共享内存数据
     * @note 会忽略ImageType中Additional
     *
     * @param data 图片数据
     */
    void operator=(const ImageType& data);
    /**
     * @brief 获取名称
     * @note 不会获取data中图片指针所有权
     * @return 返回共享内存和信号量的完整名称
     * 1. 共享内存名称
     * 2. 信号量名称
     */
    std::pair<std::string,std::string> GetName();
};

#endif
